#!/usr/bin/env python
# -*- coding:UTF-8 -*-
"""
abstract_factory.py
"""
from abc import ABCMeta, abstractmethod

class ProductA(object): pass  # A系列产品
class ProductB(object): pass  # B系列产品

class Product1A(ProductA): pass  # 工厂1生产的A系列子类产品
class Product2A(ProductA): pass  # 工厂2生产的A系列子类产品
class Product1B(ProductA): pass  # 工厂1生产的B系列子类产品
class Product2B(ProductA): pass  # 工厂2生产的B系列子类产品

class AbstractFactory(object):  # 抽象工厂
    __metaclass__ = ABCMeta  # 含抽象方法

    @staticmethod
    def choose_factory(factory_num=1):  # 根据用户参数选择具体子类工厂
        factories = {1: Factory1, 2: Factory2}
        return factories[factory_num]()

    @abstractmethod
    def get_product_a(self): pass  # 抽象方法，获取A系列产品，由子类工厂实现

    @abstractmethod
    def get_product_b(self): pass  # 抽象方法，获取B系列产品，由子类工厂实现


class Factory1(AbstractFactory):  # 子类工厂，实现父类抽象方法
    def get_product_a(self): return Product1A()  # 返回A系列的子类产品对象
    def get_product_b(self): return Product1B()  # 返回B系列的子类产品对象

class Factory2(AbstractFactory):  # 子类工厂，实现父类抽象方法
    def get_product_a(self): return Product2A()  # 返回A系列的子类产品对象
    def get_product_b(self): return Product2B()  # 返回B系列的子类产品对象